package fbv.gui;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Collection;
import java.util.Hashtable;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpUtils;

import fbv.commun.dataTools.servico.ObjetoVO;
import fbv.commun.excecoes.FBVException;
import fbv.distribuidora.cliente.servico.Cliente;
import fbv.distribuidora.fornecedor.servico.Fornecedor;
import fbv.distribuidora.produto.servico.Produto;
import fbv.distribuidora.sistema.delegate.SistemaDelegate;
import fbv.distribuidora.sistema.servico.Sistema;

/**
 * Servlet implementation class for Servlet: ServletProduto
 */
public class ServletProduto extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet, GuiPadrao {
	static final long serialVersionUID = 1L;

	private Map<String, String> dados;
	private Sistema sistema;

	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#HttpServlet()
	 */
	public ServletProduto() {
		super();
	} 

	private void encaminharSolicitacao(HttpServletRequest request, HttpServletResponse response, String retorn){

		try {
			sistema = SistemaDelegate.getInstancia();

			String url = "/painelAdmin/principal.jsp?";

			if(retorn.equals("atualizar")){

				Collection<ObjetoVO> collection = sistema.consultarTodosFornecedores();
				request.setAttribute("fornecedores", collection);
				url += "pagina=2&subPagina=2";

			}
			else if(retorn.equals("excluir")){
				url += "pagina=2&subPagina=3";
			}
			else{
				url += "pagina=2&subPagina=5";
			}

			RequestDispatcher rd = getServletContext().getRequestDispatcher(url);
			ObjetoVO produtoVO;
			ObjetoVO fornecedorVO; 

			produtoVO = sistema.consultarProduto(request.getParameter("cod"));
			fornecedorVO = sistema.consultarFornecedor(produtoVO.getPropriedade(Produto.FORM_PRODUTO_FORNECEDOR));

			request.setAttribute("idFornecedor", fornecedorVO.getChave());
			request.setAttribute(Produto.FORM_PRODUTO_FORNECEDOR, fornecedorVO.getPropriedade(Fornecedor.FORM_FORNECEDOR_RAZAO_SOCIAL));

			request.setAttribute(Produto.FORM_PRODUTO_ID, produtoVO.getChave());
			request.setAttribute(Produto.FORM_PRODUTO_DESCRICAO, produtoVO.getPropriedade(Produto.FORM_PRODUTO_DESCRICAO));
			request.setAttribute(Produto.FORM_PRODUTO_IMAGEM_URI, produtoVO.getPropriedade(Produto.FORM_PRODUTO_IMAGEM_URI));
			request.setAttribute(Produto.FORM_PRODUTO_NOME, produtoVO.getPropriedade(Produto.FORM_PRODUTO_NOME));
			request.setAttribute(Produto.FORM_PRODUTO_PRECO, produtoVO.getPropriedade(Produto.FORM_PRODUTO_PRECO));
			request.setAttribute(Produto.FORM_PRODUTO_QTD_ESTOQUE, produtoVO.getPropriedade(Produto.FORM_PRODUTO_QTD_ESTOQUE));

			rd.forward(request, response);

		} catch (NumberFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FBVException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ServletException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		if(request.getParameter("opcao") != null){
			encaminharSolicitacao(request, response, request.getParameter("opcao"));
		}

		if(request.getParameter("acao") != null){
			if(request.getParameter("acao").equals("consultar")){
				try {
					sistema = SistemaDelegate.getInstancia();

					RequestDispatcher rd = getServletContext().getRequestDispatcher("/painelAdmin/principal.jsp?pagina=2&subPagina=4");
					Collection<ObjetoVO> produtosVO;

					produtosVO = sistema.consultarTodosProdutos();

					request.setAttribute("produtos",produtosVO);

					rd.forward(request, response);

				}catch (Exception e) {
					e.printStackTrace();
				}		
			}

			else if(request.getParameter("acao").equals("adicionar")){
				try {
					sistema = SistemaDelegate.getInstancia();

					RequestDispatcher rd = getServletContext().getRequestDispatcher("/painelAdmin/principal.jsp?pagina=2&subPagina=1");
					Collection<ObjetoVO> fornecedoresVO;

					fornecedoresVO = sistema.consultarTodosFornecedores();

					request.setAttribute("fornecedores",fornecedoresVO);

					rd.forward(request, response);

				}catch (Exception e) {
					e.printStackTrace();
				}	
			}
		}	
	}  	

	/* (non-Java-doc)
	 * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */

	private void getCampos(HttpServletRequest request){
		dados = new Hashtable<String, String>();


		dados.put(Produto.FORM_PRODUTO_NOME, request.getParameter(Produto.FORM_PRODUTO_NOME));
		if(! request.getParameter(Produto.FORM_PRODUTO_FORNECEDOR).equals("#")){
			dados.put(Produto.FORM_PRODUTO_FORNECEDOR, request.getParameter(Produto.FORM_PRODUTO_FORNECEDOR));
		}
		dados.put(Produto.FORM_PRODUTO_PRECO, request.getParameter(Produto.FORM_PRODUTO_PRECO));
		dados.put(Produto.FORM_PRODUTO_QTD_ESTOQUE, request.getParameter(Produto.FORM_PRODUTO_QTD_ESTOQUE));		
		dados.put(Produto.FORM_PRODUTO_DESCRICAO, request.getParameter(Produto.FORM_PRODUTO_DESCRICAO));
		dados.put(Produto.FORM_PRODUTO_IMAGEM_URI, uploadFotoProduto(request));		
	}	

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		sistema = SistemaDelegate.getInstancia();
		String acao = (String)request.getParameter(GuiPadrao.ACAO);
		String url = "ServletProduto?acao="; 

		if(acao != null)
		{
			try{
				if(acao.equals(GuiPadrao.ACAO_ADICIONAR)){
					getCampos(request);
					sistema.cadastrarProduto(dados);
					url += "adicionar";
				}
				else if(acao.equals(GuiPadrao.ACAO_ALTERAR)){
					getCampos(request);
					dados.put(Produto.FORM_PRODUTO_ID, request.getParameter(Produto.FORM_PRODUTO_ID));
					sistema.alterarProduto(dados);
					url += "consultar";
				}
				else if(acao.equals(GuiPadrao.ACAO_CONSULTAR)){
					sistema.consultarProduto(request.getParameter(Produto.FORM_PRODUTO_ID));
					url += "consultar";
				}

				else if(acao.equals(GuiPadrao.ACAO_EXCLUIR)){
					sistema.excluirProduto(Integer.parseInt(request.getParameter(Produto.FORM_PRODUTO_ID)));
					url += "consultar";
				}
				response.sendRedirect(url);
			}
			catch (NumberFormatException e) {
				e.printStackTrace();
				response.sendRedirect(url);
			}	
			catch (FBVException e) {
				e.printStackTrace();
				response.sendRedirect(url);
			}
		}
	}  

	public String uploadFotoProduto(HttpServletRequest request){
		// the directory where the uploaded file will be saved.
		String savePath = "C:\\teste\\";

		String filename = "";
		String nome = "";
		String ext = "";

		try{
			RandomAccessFile f = null;
			ServletInputStream in = request.getInputStream();

			byte[] line = new byte[128];
			int i = in.readLine(line, 0, 128);
			int boundaryLength = i - 2;
			String boundary = "";
			if(boundaryLength >= 0)
				boundary = new String(line, 0, boundaryLength); 
			//-2 discards the newline character

			while (i != -1) {
				String newLine = new String(line, 0, i);
				if (newLine.startsWith("Content-Disposition: form-data; name=\"")) {
					String s = new String(line, 0, i-2);
					int pos = s.indexOf("filename=\"");
					if (pos != -1) {
						String filepath = s.substring(pos+10, s.length()-1);
						// Windows browsers include the full path on the client
						// But Linux/Unix and Mac browsers only send the filename
						// test if this is from a Windows browser
						System.err.println(filepath);
						pos = filepath.lastIndexOf("\\");
						if (pos != -1)
							filename = filepath.substring(pos + 1);
						else
							filename = filepath;
					}

					//this is the file content
					i = in.readLine(line, 0, 128);
					i = in.readLine(line, 0, 128);
					// blank line
					i = in.readLine(line, 0, 128);

					ByteArrayOutputStream buffer = new ByteArrayOutputStream();
					newLine = new String(line, 0, i);

					while (i != -1 && !newLine.startsWith(boundary)) {
						// the problem is the last line of the file content
						// contains the new line character.
						// So, we need to check if the current line is
						// the last line.
						buffer.write(line, 0, i);
						i = in.readLine(line, 0, 128);
						newLine = new String(line, 0, i);
					}
					try {
						if(filename.length() >= 0 && filename.lastIndexOf(".") >=0)
						{
							ext = filename.substring(filename.lastIndexOf("."),filename.length());

							nome = savePath + filename.hashCode()+ext;

							// save the uploaded file
							f = new RandomAccessFile(nome, "rw");
							byte[] bytes = buffer.toByteArray();
							if(bytes.length >= 2)
								f.write(bytes, 0, bytes.length - 2);
						}
					}
					catch (Exception e) {
						e.printStackTrace();
					}
					finally{
						if(f != null)
							f.close();
					}
				}
				i = in.readLine(line, 0, 128);

			} // end while
		}catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("nome retornado: "+nome);
		return nome;
	}
}